上一篇在交叉驗證的過程中,提到超參數的計算是使用窮舉法,因此要設定好參數的區間,來在訓練的過程中對參數進行測試。
而在這次使用中我參考了本篇文章:LightGBM核心解析与调参
正如我們在第十四天與第十五天提到的,調參數是為了在變異以及偏誤中權衡(也有人叫方差與偏差),因此有些參數是提高變異降低偏誤,有些則相反,認識這些參數的影響也能夠幫助你調整參數。
關於調參更知識性的內容可以參考這篇
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import GridSearchCV # Perforing grid search
from sklearn.model_selection import train_test_split
train_data = total_data.copy() # 拷貝文件 務必使用copy避免修改原始資料集
y = train_data.pop('target').values # 用pop取出預測集的答案
col = train_data.columns
x = train_data[col].values # 除了答案列以外的都放入訓練
train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0) # 切分訓練與驗證集
parameters = {
# 超參數名稱 : 超參數區間
'max_depth': [10,15, 20, 25, 30], #
'learning_rate': [0.005,0.01, 0.02, 0.05, 0.1]
}
# 當中每一項都可以列入窮舉
# 但一次不要放太多 會導致訓練時間拉長
gbm = lgb.LGBMRegressor(boosting_type='gbdt',
verbose = 0,
learning_rate = 0.01,
num_leaves = 35,
feature_fraction=0.8,
bagging_fraction= 0.9,
bagging_freq= 8,
lambda_l1= 0.6,
lambda_l2= 0)
# fit GridSearchCV 就可以得到模型並且預測了
gsearch = GridSearchCV(gbm, param_grid=parameters, cv=3)
gsearch.fit(train_x, train_y)
print("Best score: %0.3f" % gsearch.best_score_) # 模型最佳績效
print("Best parameters set:") # 窮舉後的最佳參數
best_parameters = gsearch.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print("\t%s: %r" % (param_name, best_parameters[param_name]))